#include<bits/stdc++.h>
using namespace std;
struct b{
    int l,r;
}bad[100005];
struct c{
    int weizhi,abi;
}mach[100005];
bool good[100005];
int sum[1000005];
void Clear(int n,int L){
    for(int i=1;i<=n;i++){
        good[i]=false;
        bad[i].l=bad[i].r=0;
        mach[i].weizhi=mach[i].abi=0;
    }
    for(int i=0;i<=L+1;i++) sum[i]=0;
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int T;
    scanf("%d",&T);
    while(T--){
        int n,m,L,V,ans1=0,ans2=0;
        scanf("%d%d%d%d",&n,&m,&L,&V);
        for(int i=1;i<=n;i++){
            int d,v,a;
            scanf("%d%d%d",&d,&v,&a);
            if(a>0){
                if(v>V){
                    bad[i].l=d;
                    bad[i].r=L;
                }
                else{
                    bad[i].l=(V*V-v*v)/(2*a)+1+d;
                    bad[i].r=L;
                    if(bad[i].l>L) good[i]=true;
                }
            }
            else if(a<0){
                if(v<=V) good[i]=true;
                else{
                    bad[i].l=d;
                    if((V*V-v*v)%(2*a)==0) bad[i].r=(V*V-v*v)/(2*a)-1+d;
                    else bad[i].r=(V*V-v*v)/(2*a)+d;
                    bad[i].r=min(L,bad[i].r);
                }
            }
            else{
                if(v>V){
                    bad[i].l=d;
                    bad[i].r=L;
                }
                else good[i]=true;
            }
            /*if(good) printf("good!\n");
            else printf("%d %d\n",l,r);*/
        }
        for(int i=1;i<=m;i++){
            scanf("%d",&mach[i].weizhi);
            sum[mach[i].weizhi]++;
        }
        for(int i=1;i<=L;i++) sum[i]+=sum[i-1];
        //for(int i=1;i<=L+1;i++) printf("%d ",query(i));
        for(int i=1;i<=n;i++){
            if(good[i]) continue;
            if(sum[bad[i].r]-sum[bad[i].l-1]>0) ans1++;
        }
        printf("%d %d\n",ans1,0);
        Clear(n,L);
    }
    return 0;
}
